import java.util.ArrayList;

public class Dado {
	public static final int NENHUM = 0;
	public static final int LEITURA = 1;
	public static final int ESCRITA = 2;
	private String valor;
	private int bloqueio;
	private int bloqueioTransacaoId;
	private RegistroTransacao rTs;
	
	private static ArrayList<Dado> dados = new ArrayList<Dado>();
	
	public static Dado getInstance(String campo)
	{
		Dado dado;
		if((dado = contemCampo(campo)) != null)
		{
			return dado;
		}
		else
		{
			dado = new Dado(campo);
			dado.setValor(dados.size()+"");
			dados.add(dado);
			return dado;
		}
	}
	
	private static Dado contemCampo(String campo)
	{
		for(Dado dado : dados)
		{
			if(campo.equals(dado.getIdDado()))
			{
				return dado;
			}
		}
		return null;
	}

	private Dado(String nome) {
		bloqueio = NENHUM;
		rTs = new RegistroTransacao(nome);
	}

	public String getValor() {
		return valor;
	}

	public int getBloqueio() {
		return bloqueio;
	}

	public int getBloqueioTransacaoId() {
		return bloqueioTransacaoId;
	}

	public void setBloqueioTransacaoId(int bloqueioTransacaoId) {
		this.bloqueioTransacaoId = bloqueioTransacaoId;
	}

	public void setBloqueio(int bloqueio) {
		this.bloqueio = bloqueio;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}
	
	/*
	 * Getters and setters
	 */
	public String getIdDado() {
		return rTs.idDado;
	}
	
	public long getTimestampRead() {
		return rTs.timestampRead;
	}
	
	public long getTimestampWrite() {
		return rTs.timestampWrite;
	}
	
	public void setIdDado(String idDado) {
		rTs.idDado = idDado;
	}
	
	public void setTimestampRead(long tsRead) {
		rTs.timestampRead = tsRead;
	}
	
	public void setTimestampWrite(long tsWrite) {
		rTs.timestampWrite = tsWrite;
	}
	
	private class RegistroTransacao
	{
		public String idDado;
		public long timestampRead;
		public long timestampWrite;
		
		public RegistroTransacao(String idDado) {
			this.idDado = idDado;
		}

		@Override
		public String toString() {
			return "RegistroTransacao [idDado=" + idDado + ", timestampRead="
					+ timestampRead + ", timestampWrite=" + timestampWrite
					+ "]";
		}
	}

	@Override
	public String toString() {
		return "Dado [valor=" + valor + ", bloqueio=" + bloqueio
				+ ", bloqueioTransacaoId=" + bloqueioTransacaoId + ", rTs="
				+ rTs + "]";
	}
}
